Service Workerに向かってメッセージを送ってService Worker側から返事を返す方法
やりたいこと
やりかた
以下は送る側。
code:ts
/**
* Send a message to Service Worker
* @param message
*/
function sendToServiceWorker(message: any): Promise<MessageEvent> {
return new Promise((resolve, reject) => {
if (!("serviceWorker" in navigator)) {
reject(new Error("Service Worker not supported"));
return;
}
if (navigator.serviceWorker.controller === null) {
reject(new Error("navigator.serviceWorker.controller is null"));
return;
}
const messageChannel = new MessageChannel();
messageChannel.port1.onmessage = resolve;
});
}
anyなのはもともと.postMessage(message: any)なのでしょうがない。
code:sw.js
self.addEventListener('message', (e) => {
// メッセージを受け取る
const message = e.data;
// 何か処理する
...
// 返事を作る
const reply = "this message is from sw.js";
// 返事を返す
e.ports0.postMessage(reply); });
e.dataは最初のコードのmessageと等しくなる。
replyは今回は文字列だが文字列に限らずJSONなども送れる。 参考